home *** CD-ROM | disk | FTP | other *** search
/ Aminet 45 / Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso / Aminet / dev / e / 2b_CrtvE_src.lha / preprocessor.s < prev   
Text File  |  2001-01-29  |  21KB  |  940 lines

  1. ;; Preprocessor
  2.  
  3. ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
  4. ;   The (Macro) PreProcessor                ;
  5. ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
  6.  
  7. ; - recursive macros
  8. ; - check end_of_source at each "\n" skipped.
  9.  
  10. ;; Macro structure offsets
  11. MAC_NEXT    = 0
  12. MAC_NAME    = 4
  13. MAC_BODY    = 8
  14. MAC_NARGS   = 12
  15. MAC_FLAGS   = 14    ; .B
  16. ;*-*
  17. ;; Macro characters
  18. PREPCHARS:
  19.     DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0    ; 0
  20.     DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0    ; 16
  21.     DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0    ; 32
  22.     DC.B    4,4,4,4,4,4,4,4, 4,4,0,0,0,0,0,0    ; 48
  23.  
  24.     DC.B    0,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5    ; 64
  25.     DC.B    5,5,5,5,5,5,5,5, 5,5,5,0,0,0,0,5    ; 80
  26.     DC.B    0,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5    ; 96
  27.     DC.B    5,5,5,5,5,5,5,5, 5,5,5,0,0,0,0,0
  28.  
  29.     DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0    ; 128
  30.     DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
  31.     DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
  32.     DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
  33.  
  34.     DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
  35.     DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
  36.     DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
  37.     DC.B    0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
  38. ;*-*
  39.  
  40. ; IN TOKENIZE CONTEXT: A0=SOURCE, A1=INTERIM, A2=IDENT WORK, D4=LAST TOKEN
  41. ;; Preprocessor macros
  42. PREPTA: MACRO               ; \1=AX
  43.     LEA PREPCHARS,\1
  44.     ENDM
  45.  
  46. PREPID: MACRO               ; \1=TAB.AX, \2=CHAR.L.DX
  47.     CMP.B   #5,0(\1,\2.L)
  48.     ENDM
  49.  
  50. PREPIDR:MACRO               ; \1=TAB.AX, \2=CHAR.L.DX
  51.     CMP.B   #4,0(\1,\2.L)
  52.     ENDM
  53. ;*-*
  54.  
  55. PREP:             ; JUST READ A "#"
  56.     ADDQ.L  #1,A0
  57.     CMP.B   #"d",D6
  58.     BNE.S   .1
  59.     CMP.B   #"e",(A0)
  60.     BEQ.S   PREPDEF
  61.     CMP.B   #"a",(A0)
  62.     BEQ     PREPDATE
  63.     BRA     iERROR63
  64. .1: CMP.B   #"i",D6
  65.     BEQ.W   PREPIF
  66.     CMP.B   #"e",D6
  67.     BEQ.W   PREPENDIF
  68.     BRA iERROR63
  69.  
  70. ; format:
  71. ; 32-255: normal chars
  72. ; "\t" and "\\\n" translated to " "
  73. ; "\n" is end of macro (0)
  74. ; chars 1-31 are args.
  75. ; ";" not allowed
  76. ;; #define
  77.  
  78. PREPDEF:              ; #define
  79.     LEA .1(PC),A6
  80.     BSR PREPKCMP
  81.     BSR PREPWHITE
  82.     GETM    A5          ; A5=MEM
  83.     MOVE.L  A5,A4           ; A4=IDENT
  84.     PREPTA  A6          ; A6=TABLE
  85.     MOVEQ   #0,D0
  86.     MOVE.B  (A0)+,D0        ; D0=CHAR
  87.     MOVEQ   #0,D1           ; D1=HASH
  88.     PREPID  A6,D0
  89.     BMI iERROR64
  90. .XL:HASHC   D1,D0
  91.     MOVE.B  D0,(A5)+
  92.     MOVE.B  (A0)+,D0
  93.     PREPIDR A6,D0
  94.     BPL.S   .XL
  95.     SUBQ.L  #1,A0
  96.     CLR.B   (A5)+
  97.     MOVE.L  A5,D0
  98.     BTST    #0,D0
  99.     BEQ.S   .2
  100.     CLR.B   (A5)+
  101. .2: HASHE   D1
  102.     LSL.L   #2,D1
  103.     ADD.L   #MACROHASH,D1
  104.     MOVE.L  D1,A6
  105.     BSR PREPFINDMACRO
  106.     TST.L   D0
  107.     BNE iERROR66
  108.     MOVE.L  D1,A6
  109.     MOVE.L  (A6),(A5)       ; MAC_NEXT
  110.     MOVE.L  A5,(A6)
  111.     MOVE.L  A5,A6           ; A6=MACOBJ
  112.     ADDQ.L  #4,A5
  113.     MOVE.L  A4,(A5)+        ; MAC_NAME
  114.     CLR.L   (A5)+           ; MAC_BODY
  115.     CLR.L   (A5)+           ; MAC_NARGS + MAC_FLAGS
  116.     DONEH   A5          ; -->FOR MACBODY NEEDS HEAVY
  117.     ;BSR    PREPWHITE
  118.     MOVE.L  WORK,A2
  119.     MOVE.L  A2,D7           ; A2,D7=ARGSASC
  120.     CMP.B   #"(",(A0)
  121.     BNE.S   .NARGS
  122.     ADDQ.L  #1,A0
  123.     PREPTA  A5          ; A5=TAB
  124.     MOVEQ   #0,D0
  125.     MOVEQ   #0,D1           ; D1=NARG
  126. .AL:    BSR PREPWHITE
  127.     ADDQ.L  #1,D1
  128.     MOVE.B  (A0)+,D0
  129.     PREPID  A5,D0
  130.     BMI iERROR64
  131. .ALC:   MOVE.B  D0,(A2)+
  132.     MOVE.B  (A0)+,D0
  133.     PREPIDR A5,D0
  134.     BPL.S   .ALC
  135.     SUBQ.L  #1,A0
  136.     CLR.B   (A2)+
  137.     ;               ; -->CHECK FOR DOUBLARGS?
  138.     BSR PREPWHITE
  139.     CMP.B   #",",(A0)+
  140.     BEQ.S   .AL
  141.     CMP.B   #")",-1(A0)
  142.     BNE iERROR64
  143.     MOVE.W  D1,MAC_NARGS(A6)
  144. .NARGS: BSR PREPWHITE
  145.     CLR.B   (A2)+
  146.     GETM    A3          ; A3,D6=PRE_ANA_MACBODY
  147.     MOVE.L  A3,MAC_BODY(A6)
  148.     MOVE.L  A3,D6
  149.     PREPTA  A6          ; A6=TAB
  150.     MOVEQ   #0,D0
  151. .MBL:   MOVE.B  (A0)+,D0
  152.     CMP.B   #10,D0
  153.     BEQ.W   .MBX
  154.     CMP.B   #"\",D0
  155.     BEQ.W   .BSL
  156.     CMP.B   #" ",D0
  157.     BEQ.W   .SP
  158.     CMP.B   #9,D0
  159.     BEQ.W   .TAB
  160.     CMP.B   #";",D0
  161.     BEQ iERROR64
  162.     CMP.W   #32,D0
  163.     BMI iERROR64
  164.     PREPID  A6,D0
  165.     BMI.S   .CH
  166.     MOVE.L  D7,A2           ; A2=ASCIIARGS
  167.     SUBQ.L  #1,A0
  168.     MOVE.L  A0,D5           ; D5=START ID IN TEXT
  169.     MOVEQ   #0,D2           ; D2=NTH ARG
  170. .FAL:   TST.B   (A2)
  171.     BEQ.S   .CRI
  172.     ADDQ.L  #1,D2
  173.     MOVE.L  D5,A0
  174. .FALI:  CMPM.B  (A2)+,(A0)+
  175.     BEQ.S   .FALI
  176.     TST.B   -(A2)
  177.     BEQ.S   .MA
  178. .FAN:   TST.B   (A2)+
  179.     BNE.S   .FAN
  180.     BRA.S   .FAL
  181. .MA:    ADDQ.L  #1,A2
  182.     MOVE.B  -(A0),D0
  183.     PREPIDR A6,D0
  184.     BPL.S   .FAL
  185.     MOVE.B  D2,D0
  186.     BRA.S   .CH         ; INSERT ARGNUM AS CHAR
  187. .CRI:   MOVE.L  D5,A0
  188. .CRIL:  MOVE.B  (A0)+,D0
  189.     MOVE.B  D0,(A3)+
  190.     PREPIDR A6,D0
  191.     BPL.S   .CRIL
  192.     SUBQ.L  #2,A0
  193.     SUBQ.L  #2,A3
  194.     MOVE.B  (A0)+,D0        ; LAST AS CH FOR CHECK
  195. .CH:    MOVE.B  D0,(A3)+
  196.     MOVE.L  A3,D1
  197.     SUB.L   D6,D1
  198.     CMP.L   #1000,D1
  199.     BPL iERROR64
  200.     BRA.W   .MBL
  201. .MBX:   SUBQ.L  #1,A0
  202.     CLR.B   (A3)+
  203.     MOVE.L  A3,D0
  204.     BTST    #0,D0
  205.     BEQ.S   .3
  206.     CLR.B   (A3)+
  207. .3: DONEH   A3
  208.     BRA.W   PREPDONE
  209. .1: DC.B    "efine",0
  210. .BSL:   CMP.B   #10,(A0)
  211.     BNE.S   .CH
  212.     ADDQ.L  #1,A0
  213.     ADDQ.W  #1,LINENUM
  214.     CMPA.L  ENDECODE,A0
  215.     BPL iERROR64
  216.     MOVEQ   #" ",D0
  217.     BRA.S   .CH
  218. .SP:    CMP.B   #" ",(A0)+
  219.     BEQ.S   .SP
  220.     SUBQ.L  #1,A0
  221.     BRA.S   .CH
  222. .TAB:   CMP.B   #9,(A0)+
  223.     BEQ.S   .TAB
  224.     SUBQ.L  #1,A0
  225.     MOVEQ   #" ",D0
  226.     BRA.S   .CH
  227. ;*-*
  228. ;; #date
  229.  
  230. PREPDATE:             ; #date
  231.     LEA .1(PC),A6           ; name
  232.     BSR PREPKCMP            ; check if true
  233.     TST.L   UTILBASE        ;
  234.     BEQ     iERROR76         ;
  235.     BSR PREPWHITE           ; and if yes - skip whitespaces.
  236.     GETM    A5              ; A5=buffer mem
  237.     MOVE.L  A5,A4           ; A4=IDENT
  238.     PREPTA  A6              ; A6=TABLE
  239.     MOVEQ   #0,D0           ;
  240.     MOVE.B  (A0)+,D0        ; D0=CHAR
  241.     MOVEQ   #0,D1           ; D1=HASH
  242.     PREPID  A6,D0           ;
  243.     BMI iERROR64             ;
  244. .XL:HASHC   D1,D0           ; calculate macro hashvalue
  245.     MOVE.B  D0,(A5)+        ; A5 - macro name
  246.     MOVE.B  (A0)+,D0        ;
  247.     PREPIDR A6,D0           ;
  248.     BPL.S   .XL             ; until end of macro name
  249.     SUBQ.L  #1,A0           ;
  250.     CLR.B   (A5)+           ; macro name = "name\0"
  251.     MOVE.L  A5,D0           ;
  252.     BTST    #0,D0           ;
  253.     BEQ.S   .2              ;
  254.     CLR.B   (A5)+           ; must be word aligned
  255. .2: HASHE   D1              ;
  256.     LSL.L   #2,D1           ;
  257.     ADD.L   #MACROHASH,D1   ; add macro to hash table
  258.     MOVE.L  D1,A6           ;
  259.     BSR PREPFINDMACRO       ; and check if it wasn't already defined
  260.     TST.L   D0              ;
  261.     BNE iERROR66             ;
  262.     MOVE.L  D1,A6           ; restore location
  263.     MOVE.L  (A6),(A5)       ; and add to list
  264.     MOVE.L  A5,(A6)         ;
  265.     MOVE.L  A5,A6           ; A6=MACOBJ
  266.     ADDQ.L  #4,A5           ; leave space for links
  267.     MOVE.L  A4,(A5)+        ; MAC_NAME
  268.     CLR.L   (A5)+           ; MAC_BODY
  269.     CLR.L   (A5)+           ; MAC_NARGS + MAC_FLAGS
  270.     DONEM   A5              ; -->FOR MACBODY NEEDS HEAVY
  271.  
  272.     BSR     PREPWHITE
  273.     BSR     .PREPARE
  274.  
  275.     GETM    A3              ; A3,D6=PRE_ANA_MACBODY
  276.     MOVE.L  A3,A2
  277.     MOVE.L  A3,MAC_BODY(A6) ;
  278.     MOVE.B  (A0)+,D0
  279.     CMP.B   #"'",D0
  280.     BNE     iERROR64
  281.     MOVE.B  D0,(A3)+
  282. .LOOP:
  283.     MOVE.B  (A0)+,D0
  284.     CMP.B   #"%",D0
  285.     BEQ     .EXTEND
  286.     MOVE.B  d0,(A3)+
  287.     CMP.B   #"'",D0
  288.     BNE     .LOOP
  289.     CMP.B   #"'",(a0)+
  290.     BEQ     .LOOP
  291.     SUBQ.L  #1,A0
  292.     CLR.B   (A3)+
  293.     MOVE.L  A3,D0
  294.     BTST    #0,D0
  295.     BEQ     .DONTSET
  296.     CLR.B   (A3)+
  297. .DONTSET:
  298.     DONEH   A3
  299.     BRA.W   PREPDONE
  300.  
  301. .PREPARE:
  302.     MOVEM.L D0-D7/A0-A6,-(A7)
  303.     TST.L   .BCRES
  304.     BNE     .SKIP_GO
  305.     LEA .BCNAME(PC),A1
  306.     MOVE.L  $4.W,A6
  307.     JSR     -498(A6)
  308.     MOVE.L  D0,.BCRES
  309.     MOVE.L  .BCRES,A6
  310.     JSR     -12(A6)
  311.     LEa     .DATESTORE(PC),A0
  312.     MOVE.L  UTILBASE,A6
  313.     JSR     -120(A6)
  314.  
  315. .SKIP_GO:
  316.     MOVEM.L (A7)+,D0-D7/A0-A6
  317.     RTS
  318.  
  319. .EXTEND:
  320.     MOVEQ   #0,D1
  321.     MOVe.B  (A0)+,D0
  322.     CMp.B   #"%",D0
  323.     BEQ     .S01
  324.     CMP.B   #"d",D0
  325.     BEQ     .S02
  326.     CMp.B   #"m",D0
  327.     BEQ     .S03
  328.     CMp.B   #"y",D0
  329.     BEQ     .S04
  330.     CMp.B   #"D",D0
  331.     BEQ     .S05
  332.     CMp.B   #"M",D0
  333.     BEQ     .S06
  334.     CMP.B   #"Y",D0
  335.     BEQ     .S09
  336.     CMP.B   #"a",D0
  337.     BNE     .XX
  338.     MOVE.B  (A0)+,D0
  339.     CMP.B   #"D",D0
  340.     BEQ     .S07
  341.     CMP.B   #"M",D0
  342.     BEQ     .S08
  343. .XX:BRA     iERROR64
  344. .S01:
  345.     MOVE.B  #"%",(A3)+
  346.     BRA     .LOOP
  347. .S02:
  348.     MOVE.W  .DATESTORE+6(PC),D1
  349.     MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
  350.     MOVEQ   #1,D3
  351.     BSR     .PUTNUMBER
  352.     MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
  353.     BRA     .LOOP
  354. .S03:
  355.     MOVE.W  .DATESTORE+8(PC),D1
  356.     MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
  357.     MOVEQ   #1,D3
  358.     BSR     .PUTNUMBER
  359.     MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
  360.     BRA     .LOOP
  361. .S04:
  362.     MOVE.W  .DATESTORE+10(PC),D1
  363.     MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
  364.     MOVEQ   #3,D3
  365.     BSR     .PUTNUMBER
  366.     MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
  367.     BRA     .LOOP
  368. .S05:
  369.     MOVE.W  .DATESTORE+12(PC),D1
  370.     MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
  371.     LEA     LongDays,A1
  372.     BSR     .PUTSTRING
  373.     MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
  374.     BRA     .LOOP
  375. .S06:
  376.     MOVE.W  .DATESTORE+8(PC),D1
  377.     SUBQ.L  #1,D1
  378.     MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
  379.     LEA     LongMonths,A1
  380.     BSR     .PUTSTRING
  381.     MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
  382.     BRA     .LOOP
  383. .S07:
  384.     MOVE.W  .DATESTORE+12(PC),D1
  385.     MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
  386.     LEA     ShortDays,A1
  387.     BSR     .PUTSTRING
  388.     MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
  389.     BRA     .LOOP
  390. .S08:
  391.     MOVE.W  .DATESTORE+8(PC),D1
  392.     SUBQ.L  #1,D1
  393.     MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
  394.     LEA     ShortMonths,A1
  395.     BSR     .PUTSTRING
  396.     MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
  397.     BRA     .LOOP
  398. .S09:
  399.     MOVEQ   #0,D1
  400.     MOVE.W  .DATESTORE+10(PC),D1
  401. .S09_1:
  402.     SUB.L   #100,D1
  403.     BPL     .S09_1
  404.     ADD.L   #100,D1
  405.     MOVEM.L D0-D7/A1-A2/A4-A6,-(A7)
  406.     MOVEQ   #1,D3
  407.     BSR     .PUTNUMBER
  408.     MOVEM.L (A7)+,D0-D7/A1-A2/A4-A6
  409.     BRA     .LOOP
  410.  
  411.  
  412. .PUTSTRING:
  413.     LSL.W   #2,D1
  414.     MOVE.L  0(A1,D1),A1
  415. .P:
  416.     MOVE.B  (A1)+,(A3)+
  417.     TST.B   (A1)
  418.     BNE     .P
  419.     RTS
  420.  
  421. .PUTNUMBER:
  422.     LSL.W   #1,D3
  423.     LEA     .NUMBERS(PC),A1
  424.     ADD.L   D3,A1
  425.     LSR.W   #1,D3
  426.  
  427. .D: MOVEQ   #-1,D2
  428. .S: ADDQ.L  #1,D2
  429.     SUB.W   (A1),D1
  430.     BPL     .S
  431.     ADD.W   (A1),D1
  432.     ADD.B   #"0",D2
  433.     MOVE.B  D2,(A3)+
  434.     SUBQ.L  #2,A1
  435.     DBF     D3,.D
  436.     RTS
  437. .NUMBERS:
  438.     DC.W    1,10,100,1000,10000
  439.  
  440. .DATESTORE:
  441.     DC.L    0,0,0,0
  442. .BCRES:
  443.     DC.L    0
  444. .BCNAME:
  445.     DC.B    "battclock.resource",0
  446. .1: DC.B    "ate",0
  447.     EVEN
  448. ;*-*
  449. ;; #ifdef
  450. PREPIF:               ; #ifdef, #ifndef
  451.     CMP.B   #"f",(A0)+
  452.     BNE iERROR63
  453.     MOVEQ   #-1,D7          ; D7=TRUTHFLAG
  454.     CMP.B   #"n",(A0)
  455.     BNE.S   .2
  456.     MOVEQ   #0,D7
  457.     ADDQ.L  #1,A0
  458. .2: LEA .1(PC),A6
  459.     BSR PREPKCMP
  460.     BSR PREPWHITE
  461.     MOVE.L  WORK,A2
  462.     MOVE.L  A2,D6           ; A2,D6=IDENT
  463.     PREPTA  A6          ; A6=TAB
  464.     MOVEQ   #0,D0
  465.     MOVEQ   #0,D1           ; D1=HASH
  466.     MOVE.B  (A0)+,D0
  467.     PREPID  A6,D0
  468.     BMI iERROR67
  469. .CL:    MOVE.B  D0,(A2)+
  470.     HASHC   D1,D0
  471.     MOVE.B  (A0)+,D0
  472.     PREPIDR A6,D0
  473.     BPL.S   .CL
  474.     CLR.B   (A2)+
  475.     SUBQ.L  #1,A0
  476.     BSR PREPWHITE
  477.     CMP.B   #10,(A0)
  478.     BNE iERROR67
  479.     MOVE.L  D6,A2
  480.     HASHE   D1
  481.     LSL.L   #2,D1
  482.     ADD.L   #MACROHASH,D1
  483.     MOVE.L  D1,A6
  484.     MOVE.L  D6,A4
  485.     BSR PREPFINDMACRO
  486.     TST.L   D0
  487.     BEQ.S   .3
  488.     MOVEQ   #-1,D0
  489. .3: EOR.L   D0,D7           ; NEW TRUTH
  490.     NOT.L   D7
  491.     MOVE.W  PREPSTACKSIZE(PC),D0
  492.     LEA PREPIFSTACK(PC),A4
  493.     MOVE.B  D7,0(A4,D0.W)
  494.     ADDQ.W  #1,D0
  495.     MOVE.W  D0,PREPSTACKSIZE
  496.     CMP.W   #PREPMAXSTACK,D0
  497.     BPL iERROR65
  498.     TST.L   D7
  499.     BNE.S   .4
  500.     MOVEQ   #0,D6           ; NESTED LEVEL
  501.     ADDQ.L  #1,A0
  502. .EL:    ADDQ.W  #1,LINENUM      ; NOW EAT LF
  503.     CMPA.L  ENDECODE,A0
  504.     BPL iERROR65
  505.     BSR PREPWHITE
  506.     CMP.B   #"#",(A0)
  507.     BNE.S   .ER
  508.     ADDQ.L  #1,A0
  509.     MOVE.B  (A0),D0
  510.     CMP.W   #"i",D0
  511.     BNE.S   .E1
  512.     ADDQ.L  #1,D6
  513.     BRA.S   .ER
  514. .E1:    CMP.W   #"e",D0
  515.     BNE.S   .ER
  516.     TST.L   D6
  517.     BEQ.S   .EX
  518.     SUBQ.L  #1,D6
  519. .ER:    MOVEQ   #10,D0
  520. .ERL:   CMP.B   (A0)+,D0
  521.     BNE.S   .ERL
  522.     BRA.S   .EL
  523. .EX:    ADDQ.L  #1,A0
  524.     BRA.S   PREPENDIF
  525. .4: BRA.S   PREPDONE
  526. .1: DC.B    "def",0
  527. ;*-*
  528. ;; #endif
  529. PREPENDIF:            ; #endif
  530.     LEA .1(PC),A6
  531.     BSR PREPKCMP
  532.     MOVE.W  PREPSTACKSIZE(PC),D0
  533.     SUBQ.W  #1,D0
  534.     BMI iERROR65
  535.     MOVE.W  D0,PREPSTACKSIZE
  536.     ;LEA    PREPIFSTACK(PC),A4
  537.     ;TST.B  0(A4,D0.W)
  538.     ;BEQ    iERROR65
  539.     BRA.S   PREPDONE
  540. .1: DC.B    "ndif",0,0
  541. ;*-*
  542.  
  543. ;; PrepDone
  544. PREPDONE:
  545.     MOVE.L  STARTINTERIM,A6
  546.     SUBQ.L  #2,A6
  547.     CMPA.L  A6,A1
  548.     BNE.S   .1
  549.     MOVE.L  WORK,A2
  550.     BRA PARSELOOP
  551. .1: INTERN  105
  552. ;*-*
  553. ;; PrepKCmp
  554. PREPKCMP:
  555.     CMPM.B  (A6)+,(A0)+
  556.     BEQ.S   PREPKCMP
  557.     TST.B   -(A6)
  558.     BNE iERROR63
  559.     MOVE.B  -(A0),D6
  560.     CMP.B   #" ",D6
  561.     BEQ.S   .1
  562.     CMP.B   #10,D6
  563.     BEQ.S   .1
  564.     CMP.B   #9,D6
  565.     BNE iERROR63
  566. .1: RTS
  567. ;*-*
  568. ;; PrepWhite
  569. PREPWHITE:                ; TR ONLY D0.B
  570.     MOVE.B  (A0),D0
  571.     CMP.B   #" ",D0
  572.     BEQ.S   .1
  573.     CMP.B   #9,D0
  574.     BNE.S   .2
  575. .1: ADDQ.L  #1,A0
  576.     BRA.S   PREPWHITE
  577. .2: RTS
  578. ;*-*
  579. ;; PrepFindMacro
  580. PREPFINDMACRO:                ; A6=LISTADR,A4=STR, OUT=D0/A6
  581.     MOVEM.L A0/A1,-(A7)
  582. .XL:MOVE.L  (A6),D0
  583.     BEQ.S   .1
  584.     MOVE.L  D0,A6
  585.     MOVE.L  MAC_NAME(A6),A0
  586.     MOVE.L  A4,A1
  587. .CL:    CMPM.B  (A0)+,(A1)+
  588.     BNE.S   .XL
  589.     TST.B   -1(A0)
  590.     BNE.S   .CL
  591. .1: MOVEM.L (A7)+,A0/A1
  592.     RTS
  593. ;*-*
  594. ;; PrepExpand
  595. PREPEXPAND:
  596.     MOVE.L  WORK,A4
  597.     MOVE.L  HASHVAL(PC),D0
  598.     LSL.L   #2,D0
  599.     ADD.L   #MACROHASH,D0
  600.     MOVE.L  D0,A6
  601.     BSR PREPFINDMACRO           ; A6=MACOBJ
  602.     TST.L   D0
  603.     BNE.S   .C
  604.     RTS
  605.  
  606. .C: MOVEM.L D1-D7/A1-A6,-(A7)       ; KEEP ONLY A0,A6 FROM ENV
  607.  
  608.     TST.L   PREPESTACK
  609.     BNE.S   .1
  610.     MOVE.L  #PREPETOTAL,D0
  611.     BSR NEW
  612.     TST.L   D0
  613.     BEQ iERROR38
  614.     MOVE.L  D0,PREPESTACK
  615.     ADD.L   #PREPESTACKSIZE,D0
  616.     MOVE.L  D0,PREPEBUFUSE
  617.     ADD.L   #PREPEBUFSIZE,D0
  618.     MOVE.L  D0,PREPEBUFEND
  619. .1:
  620.     MOVE.L  PREPEBUFUSE(PC),PREPETEMP
  621.     MOVE.W  MAC_NARGS(A6),D7        ; D7.W=NARGS
  622.     BEQ.S   .NARG
  623.     BSR PREPWHITE
  624.     BSR PREPMULTIEXPAND
  625.     BRA.S   .INAC
  626.  
  627. .NARG:  MOVE.L  MAC_BODY(A6),D6         ; D6=NEW ASCCODE
  628. .INAC:  MOVE.W  PREPESTACKUSE(PC),D0
  629.     CMP.W   #PREPESTACKSIZE,D0
  630.     BPL iERROR68
  631.     MOVE.L  PREPESTACK(PC),A5       ; A5=MACEXPANSIONSTACK
  632.     MOVE.L  A0,0(A5,D0.W)
  633.     MOVE.L  PREPETEMP(PC),4(A5,D0.W)
  634.     ADDQ.W  #8,PREPESTACKUSE
  635.     MOVE.L  D6,A0
  636.     MOVEM.L (A7)+,D1-D7/A1-A6
  637.     ADDQ.L  #4,A7               ; BSR OFF STACK
  638.     BSR MOVEBUF             ; FOR LONG MACROS
  639.     BRA PARSELOOP
  640.  
  641. ;*-*
  642.  
  643. ;; PreProcessor Consts And Vars
  644. PREPMAXSTACK    = 10
  645. PREPESTACKSIZE  = 20*8
  646. PREPEBUFSIZE    = 10*KB
  647. PREPETOTAL  = PREPESTACKSIZE+PREPEBUFSIZE
  648.  
  649. ; EACH STACKFRAME: LASTA0,LASTEBUF
  650.  
  651.  
  652. PREPIFSTACK:  DS.B    PREPMAXSTACK
  653. PREPSTACKSIZE:    DC.W    0
  654.  
  655. PREPESTACK:   DC.L    0
  656. PREPESTACKUSE:    DC.W    0
  657.  
  658. PREPETEMP:    DC.L    0
  659. PREPEBUFEND:  DC.L    0
  660. PREPEBUFUSE:  DC.L    0
  661.  
  662. PREPMACROMSG: DC.B    'MACRO: ',0     ; 7
  663.  
  664. PREPMACROBODYERR: DC.L    0
  665. ;*-*
  666.  
  667. ;; PrepMacroDone
  668. PREPMACRODONE:
  669.     MOVE.W  PREPESTACKUSE(PC),D0
  670.     BEQ E
  671.     BMI E
  672.     SUBQ.W  #8,D0
  673.     MOVE.L  PREPESTACK(PC),A6
  674.     MOVE.L  0(A6,D0.W),A0
  675.     MOVE.L  4(A6,D0.W),PREPEBUFUSE
  676.     MOVE.W  D0,PREPESTACKUSE
  677.     BRA PARSELOOP
  678. ;*-*
  679. ;; PrepWriteMacroLine
  680. PREPWRITEMACROLINE:
  681.     MOVE.L  PREPMACROBODYERR(PC),D7
  682.     BEQ.S   .1
  683.     MOVE.L  #PREPMACROMSG,D2
  684.     MOVEQ   #7,D3
  685.     BSR WRITECON
  686.     MOVE.L  D7,A0
  687.     MOVE.L  D7,A1
  688. .XL:CMP.B   #10,-1(A0)
  689.     BEQ.S   .L2
  690.     CMP.B   #";",-1(A0)
  691.     BEQ.S   .L2
  692.     TST.B   -1(A0)
  693.     BPL.S   .KLUD
  694. .XB:SUBQ.L  #1,A0
  695.     BRA.S   .XL
  696. .L2:    CMP.B   #10,(A1)
  697.     BEQ.S   .D
  698.     CMP.B   #";",(A1)
  699.     BEQ.S   .D
  700.     TST.B   (A1)
  701.     BEQ.S   .D
  702.     ADDQ.L  #1,A1
  703.     BRA.S   .L2
  704. .D: CLR.B   (A1)
  705.     MOVE.L  A1,D3
  706.     MOVE.L  A0,D2
  707.     SUB.L   D2,D3
  708.     BSR WRITECON
  709.     BSR WRITELN
  710. .1: RTS
  711. .KLUD:  CMP.B   #8,-1(A0)       ; MACBODY FROM MOD HAS LEN:INT,CHARS..
  712.     BPL.S   .XB
  713.     ;ADDQ.L #1,A0           ; why?
  714.     BRA.S   .L2
  715. ;*-*
  716. ;; PrepMacroError
  717. PREPMACROERROR:
  718.     TST.W   PREPESTACKUSE
  719.     BEQ.S   .1
  720.     MOVE.L  A0,PREPMACROBODYERR
  721.     MOVE.L  PREPESTACK(PC),A0       ; OLDEST A0 BACK
  722.     MOVE.L  (A0),A0
  723. .1: RTS
  724. ;*-*
  725. ;; PrepMultiExpand
  726.  
  727. ; IN:   A0=ASCII, A6=MACOBJ, D7.W=NARGS
  728. ; FILLS PREPBUFUSE++ TO MAX PREFBUFEND
  729. ; RET NEW ASCII IN D6
  730.  
  731.  
  732. ; PROBLEMS: <CONS>
  733.  
  734. PREPMULTIEXPAND:
  735.     MOVE.L  PREPEBUFUSE(PC),A5  ; A5=CURBUF
  736.     MOVE.W  D7,D0
  737.     LSL.W   #3,D0
  738.     MOVE.L  A5,A4           ; A4,D4=ARGSBUF
  739.     MOVE.L  A4,D4
  740.     ADD.W   D0,A5
  741.     CMPA.L  PREPEBUFEND(PC),A5
  742.     BPL iERROR37
  743.     MOVE.L  A5,D6           ; D6=BEGIN
  744.     CMP.B   #"(",(A0)+
  745.     BNE iERROR0
  746.     MOVEQ   #0,D5           ; D5=BRACKET RECURSION
  747. .BL:MOVE.L  A0,(A4)+        ; SHOVE ADR FOR ARG
  748. .XL:MOVE.B  (A0)+,D0        ; HERE!!!
  749.     CMP.B   #"(",D0
  750.     BEQ.S   .UPL
  751.     CMP.B   #"[",D0
  752.     BEQ.S   .UPL
  753.     CMP.B   #"]",D0
  754.     BEQ.S   .DOL
  755.     CMP.B   #")",D0
  756.     BEQ.S   .DOL
  757.     CMP.B   #",",D0
  758.     BEQ.S   .COM
  759.     CMP.B   #"'",D0
  760.     BEQ.S   .STR
  761.     CMP.B   #'"',D0
  762.     BEQ.S   .STR
  763.     ;               ; MORE CASES HERE?
  764.     CMP.B   #10,D0
  765.     BEQ iERROR3          ; ERROR = \N \0 /* ->
  766.     CMP.B   #";",D0
  767.     BEQ iERROR3
  768.     TST.B   D0
  769.     BEQ iERROR3
  770.     CMP.B   #"/",D0
  771.     BEQ.S   .CM1
  772.     CMP.B   #"-",D0
  773.     BEQ.S   .CM2
  774.     BRA.S   .XL
  775. .COM:   TST.L   D5
  776.     BNE.S   .XL
  777.     SUBQ.W  #1,D7
  778.     BEQ iERROR0
  779. .XBL:   MOVE.L  A0,D0
  780.     SUB.L   -4(A4),D0
  781.     SUBQ.L  #1,D0
  782.     MOVE.L  D0,(A4)+        ; SHOVE LEN FOR ARG
  783.     TST.W   D7
  784.     BNE.S   .BL
  785.     BRA.S   .FILL
  786. .UPL:   ADDQ.L  #1,D5
  787.     BMI iERROR0
  788.     BRA.S   .XL
  789. .DOL:   SUBQ.L  #1,D5
  790.     BPL.S   .XL
  791.     SUBQ.W  #1,D7
  792.     BNE iERROR20
  793.     BRA.S   .XBL
  794. .CM1:   CMP.B   #"*",(A0)
  795.     BEQ iERROR0
  796.     BRA.W   .XL
  797. .CM2:   CMP.B   #">",(A0)
  798.     BEQ iERROR0
  799.     BRA.W   .XL
  800. .STR:   MOVE.B  (A0)+,D1
  801.     CMP.B   #10,D1
  802.     BEQ iERROR3
  803.     CMP.B   D0,D1
  804.     BNE.S   .STR
  805.     CMP.B   (A0),D0
  806.     BNE.W   .XL
  807.     ADDQ.L  #1,A0
  808.     BRA.S   .STR
  809. .FILL:  MOVE.L  MAC_BODY(A6),A1     ; A1=BODY (NOW FILL ARGS IN MACRO)
  810.     MOVE.L  PREPEBUFEND(PC),D3  ; D3=END
  811.     SUBQ.L  #8,D3
  812.     MOVEQ   #0,D0
  813.     MOVE.W  MAC_NARGS(A6),D7
  814.     ADDQ.L  #1,D7
  815. .FL:    CMPA.L  D3,A5
  816.     BPL iERROR37
  817.     MOVE.B  (A1)+,D0
  818.     CMP.W   D7,D0
  819.     BMI.S   .ARG
  820.     MOVE.B  D0,(A5)+
  821.     BRA.S   .FL
  822. .ARG:   TST.W   D0
  823.     BEQ.S   .XF
  824.     MOVE.L  D0,D1
  825.     SUBQ.L  #1,D1
  826.     LSL.L   #3,D1
  827.     ADD.L   D4,D1
  828.     MOVE.L  D1,A2
  829.     MOVE.L  4(A2),D1        ; D1=ARGLEN
  830.     MOVE.L  (A2),A2         ; A2=ARG
  831.     MOVE.L  A5,D2
  832.     ADD.L   D1,D2
  833.     CMP.L   D3,D2
  834.     BPL iERROR37
  835.     SUBQ.W  #1,D1
  836.     BMI.S   .AX
  837. .AL:    MOVE.B  (A2)+,(A5)+
  838.     DBRA    D1,.AL
  839. .AX:    BRA.S   .FL
  840. .XF:    CLR.B   (A5)+
  841.     MOVE.L  A5,D0
  842.     BTST    #0,D0
  843.     BEQ.S   .NA
  844.     CLR.B   (A5)+
  845. .NA:    MOVE.L  A5,PREPEBUFUSE
  846.     RTS
  847. ;*-*
  848. ;; PrepSaveMacros
  849. PREPSAVEMACROS:
  850.     BTST    #6,CODEPREFS+2
  851.     BEQ.S   .XX
  852.     MOVE.L  #ESTACKBUF,D5
  853.     MOVE.L  D5,A5           ; D5,A5=BUF
  854.     MOVE.W  #11,(A5)+
  855.     MOVE.L  #MACROHASH,A4       ; A4=TABLE
  856.     MOVE.L  #MACROHASH+1024,D4  ; D4=END
  857.     MOVEQ   #0,D7           ; D7=NUMBER OF MACROS
  858. .XL:CMP.L   A4,D4
  859.     BEQ.S   .X
  860.     MOVE.L  (A4)+,D0
  861.     BEQ.S   .XL
  862.     MOVE.L  D0,A3           ; A3=MACLIST
  863. .L2:    BTST    #0,MAC_FLAGS(A3)
  864.     BNE.S   .NEXT
  865.     ADDQ.L  #1,D7
  866.     ADDQ.W  #2,A5           ; COPY LEN+NAME
  867.     MOVE.L  A5,A1
  868.     MOVE.L  MAC_NAME(A3),A2
  869. .L3:    MOVE.B  (A2)+,(A5)+
  870.     BNE.S   .L3
  871.     CLR.B   (A5)+
  872.     MOVE.L  A5,D0
  873.     BCLR.L  #0,D0
  874.     MOVE.L  D0,A5
  875.     SUB.L   A1,D0
  876.     MOVE.W  D0,-(A1)
  877.     MOVE.L  MAC_NARGS(A3),(A5)+ ; NARGS+FLAGS+
  878.     ADDQ.W  #2,A5           ; COPY LEN+BODY
  879.     MOVE.L  A5,A1
  880.     MOVE.L  MAC_BODY(A3),A2
  881. .L4:    MOVE.B  (A2)+,(A5)+
  882.     BNE.S   .L4
  883.     CLR.B   (A5)+
  884.     MOVE.L  A5,D0
  885.     BCLR.L  #0,D0
  886.     MOVE.L  D0,A5
  887.     SUB.L   A1,D0
  888.     MOVE.W  D0,-(A1)
  889.     BSR.S   .WR
  890. .NEXT:  MOVE.L  (A3)+,A3
  891.     MOVE.L  A3,D0
  892.     BNE.S   .L2
  893.     BRA.S   .XL
  894. .X: TST.L   D7
  895.     BEQ.S   .XX
  896.     CLR.W   (A5)+
  897.     BSR .WR
  898. .XX:    RTS
  899. .WR:    MOVE.L  D5,D2
  900.     MOVE.L  A5,D3
  901.     SUB.L   D2,D3
  902.     JSR WRITEFILE
  903.     MOVE.L  D5,A5
  904.     RTS
  905.  
  906. ;*-*
  907. ;; PrepReadMacros
  908. ; A0=MOD,D1=MMODE(SKIP IF 2)
  909. PREPREADMACROS:
  910. .XL:MOVE.W  (A0)+,D0
  911.     BEQ.S   .X
  912.     MOVE.L  A0,D7           ; MAC_NAME
  913.     ADD.W   D0,A0
  914.     MOVE.L  (A0)+,D6        ; MAC_NARGS+MAC_FLAGS+..
  915.     MOVE.W  (A0)+,D0
  916.     MOVE.L  A0,D5           ; MAC_BODY
  917.     ADD.W   D0,A0
  918.     CMP.W   #2,D1
  919.     BEQ.S   .XL
  920.     MOVE.L  D7,A1
  921.     HASH    A1,D2,D3
  922.     LSL.L   #2,D2
  923.     ADD.L   #MACROHASH,D2
  924.     MOVE.L  D2,A1           ; A1=HASHSPOT
  925.     GETM    A2
  926.     MOVE.L  (A1),(A2)       ; MAC_NEXT
  927.     MOVE.L  A2,(A1)
  928.     ADDQ.L  #4,A2
  929.     MOVE.L  D7,(A2)+
  930.     MOVE.L  D5,(A2)+
  931.     MOVE.L  D6,(A2)+
  932.     BSET    #0,-2(A2)       ; MAC_FLAGS = ITS AN IMPORTED MACRO!
  933.     DONEM   A2
  934.     BRA.S   .XL
  935. .X: RTS
  936.  
  937. ;*-*
  938. ;*-*
  939.  
  940.